package com.lam.common.validate.validator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.lam.common.exception.BaseException;
import com.lam.common.utils.CollectionUtil;
import com.lam.common.utils.StringUtils;
import com.lam.common.validate.ValidateUtil;
import com.lam.common.validate.model.DataUsedDesc;

/**
 * 数据被使用校验工具
 * @author lam
 *
 */
public class DataUsedValidBean {
	
	/**
	 * 判断数据是否被指定表记录使用，例:查询某角色id是否被用户角色关联表(sys_user_role)使用，被使用则抛出 BaseException 异常
	 * @param tableName 表名
	 * @param object <表字段, 待校验数据>
	 * @param errorMsg 错误提示语
	 */
	public static void validDataUsed(String tableName, Map<String, Object> fieldMap, String errorMsg) {
		
		boolean flag = validDataUsed(tableName, fieldMap);
		if(flag) {
			throw new BaseException(errorMsg);
		}
	}
	
	/**
	 * 判断数据是否被指定表记录使用，例:查询某角色id是否被用户角色关联表(sys_user_role)使用，被使用则抛出 BaseException 异常
	 * @param tableName 表名
	 * @param object <表字段, 待校验数据>
	 * @param errorMsg 错误提示语
	 */
	public static void validDataUsed(String tableName, String selectField, Map<String, Object> fieldMap, String errorMsg) {
		
		boolean flag = validDataUsed(tableName, selectField, fieldMap);
		if(flag) {
			throw new BaseException(errorMsg);
		}
	}
	
	/**
	 * 判断数据是否被指定表记录使用，例:查询某角色id是否被用户角色关联表(sys_user_role)使用
	 * @param tableName 表名
	 * @param fieldMap <表字段, 待校验数据>
	 * @return true表示被使用，false表示未被使用
	 */
	public static boolean validDataUsed(String tableName, Map<String, Object> fieldMap) {
		
		return CollectionUtil.isNotEmpty(dataExist(tableName, "id", false, fieldMap));
	}
	
	/**
	 * 判断数据是否被指定表记录使用，例:查询某角色id是否被用户角色关联表(sys_user_role)使用
	 * @param tableName 表名
	 * @param selectField 查询列
	 * @param fieldMap <表字段, 待校验数据>
	 * @return true表示被使用，false表示未被使用
	 */
	public static boolean validDataUsed(String tableName, String selectField, Map<String, Object> fieldMap) {
		
		ValidateUtil.validRequired(tableName, "tableName不能为空！");
		ValidateUtil.validRequired(selectField, "查询列selectField不能为空！");
		ValidateUtil.validRequired(fieldMap, "数据fieldMap不能为空！");
		
		return CollectionUtil.isNotEmpty(dataExist(tableName, selectField, false, fieldMap));
	}
	
	/**
	 * 判断数据是否被指定表记录使用，例:查询某角色id是否被用户角色关联表(sys_user_role)使用，被使用则抛出BaseException 异常
	 * @param tableName 表名
	 * @param column 表字段
	 * @param object 待校验数据
	 * @param errorMsg 错误提示语
	 */
	public static void validDataUsed(String tableName, String column, Object object, String errorMsg) {
		
		List<String> list = valid(tableName, column, object);
		if(CollectionUtil.isNotEmpty(list)) {
			throw new BaseException("（"+StringUtils.list2Str(list)+"）"+errorMsg);
		}
	}
	
	/**
	 * 判断数据是否被指定表记录使用，例:查询某角色id是否被用户角色关联表(sys_user_role)使用
	 * @param tableName 表名
	 * @param column 表字段
	 * @param object 待校验数据
	 * @return true表示被使用，false表示未被使用
	 */
	public static boolean validDataUsed(String tableName, String column, Object object) {
		
		return CollectionUtil.isNotEmpty(valid(tableName, column, object));
	}
	
	private static List<String> valid(String tableName, String column, Object object) {
		
		ValidateUtil.validRequired(tableName, "tableName不能为空！");
		ValidateUtil.validRequired(column, "表字段column不能为空！");
		ValidateUtil.validRequired(object, "数据object不能为空！");
		
		boolean isList = false;
		Map<String, Object> fieldMap = new HashMap<>();
		if(object instanceof String){
			if(object.toString().contains(",")) {
				String[] ss = object.toString().split(",");
				fieldMap.put(column, Arrays.asList(ss));
				isList = true;
			}else {
				fieldMap.put(column, object);
			}
		}else if(object instanceof Collection) {
			fieldMap.put(column, new ArrayList<>((Collection<?>)object));
			isList = true;
		}else {
			fieldMap.put(column, object);
		}
		
		return dataExist(tableName, column, isList, fieldMap);
	}
	
	private static List<String> dataExist(String tableName, String selectField, boolean isList, Map<String, Object> fieldMap){
		return ValidateUtil.getValidateService().dataExist(new DataUsedDesc(tableName, selectField, isList, fieldMap));
	}
	
	
}
